package SpringFramework.AOP.Annotation.aop;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

// 声明一个切面
@Aspect
// 让这个切面称为Spring容器管理的Bean。
@Component("LogAspect.annotation")
public class LogAspect {
	// 通过@PointCut注解声明切点。
	@Pointcut("@annotation(zzz.example.Spring.AOP.Annotation.aop.Action)")
	public void annotationPointCut() {
	}
	
	// 声明一个建言，并使用@PointCut定义的切点
	@After("annotationPointCut()")
	public void after(JoinPoint joinPoint) {
		MethodSignature signature = (MethodSignature)joinPoint.getSignature();
		Method method = signature.getMethod();
		// 通过反射获得注解上的属性，然后做日志记录相关的操作
		Action action = method.getAnnotation(Action.class);
		System.out.println("注解式拦截：" + action.name());
	}
}
